#include"TcpServer.hpp"
#include<memory>
#include"Protocol.hpp"
#include"Calculator.hpp"
#include"log.hpp"
#include"Daemon.hpp"
// Calculator cal;
// 不完整->继续读
// 完整-> 提取 -> 反序列化 -> Request -> 计算模块，进行处理

using cal_t = std::function<Response(Request&)>;

class Parse{
    public:
        Parse(cal_t cal):_cal(cal)
        {}
        std::string Cal(std::string &package)
        {
            std::string content;//存放请求报文内容
            std::string respstr;//存放返回计算结果报文内容
            while(Decode(package,&content)){//解码报文
                if(content.empty())
                    break;
                Request req;
                req.Deserialize(content);//反序列化请求报文
                Response resp = _cal(req);//计算模块处理请求报文
                std::string ret;
                resp.Serialize(ret);//序列化返回报文
                Encode(ret);//封装返回报文
                respstr += ret;//拼接返回报文
            }
            return respstr;
        }
    private:
        cal_t _cal;
};


int main()
{
    ENABLE_FILE_LOG();//开启日志文件记录
    Daemon(true,true);//守护进程
    Calculator cal;//实例化计算模块

    Parse parse([&cal](Request& req){//解析模块
        return cal.Execute(req);
    });

    std::unique_ptr<Tcp_Server> server = std::make_unique<Tcp_Server>([&parse](std::string &package){//服务端
        return parse.Cal(package);
    });
    server->Init();
    server->Start();
    return 0;
}